"""
@-*- coding: utf-8 -*-
@ python：python 3.8
@ 创建人员:ylx-lingxiao
@ 创建时间:2024/10/17  22:24
@ File:study4.py
@ Explanation:本节开始学习循环语句
"""
"""
输入在Python3中我们使用input()
如input('请输入你的名字：')，这个可以引导用户来进行一个输入，输入完后，点击回车认为你此次输入结束，结束之后程序正常退出或者执行后续的代码
我们可以获取到用户的输入值，并且可以返回，那么能返回我们就可以用变量来接
所有的input输入的内容，在返回时，统一处理为字符串，无论你输入的是什么

输出如
print('你好，\n曼巴')
print('下课')
输出
你好
曼巴
下课
print本身没打印一次就会换行

print('ll,ll',end=',')  输出后以逗号结尾，默认是输出完换行，但是修改end的值就可以个性化结尾
print()    目的就是不输出，但是换行，因为上一个print是用逗号结尾，所以我这个print一个空值，但是默认要换行，所以下一个print可以换到第二行输出
print('yyy+yyy',end='.')
输出：
ll,ll，
yyy+yyy.




if语句
如果表达式非0（不是空字符串，只要你不是空的，如0 [] '' () {} False这些被认为是空的），或为布尔值True 则执行if 语句后续的内容，do_something，否则执行下一跳语句,else的后续内容，若有else
status = input('你饿了吗？')
if status == '饿':
    print('eat')
    open = input('楼下开门了吗？')
    if open == '开':
        print('下来吃饭')
    else:
        print('吃个其它的')
else:
    print('study')
    
如果你输入饿，那么执行if语句，如果你输入的不是饿，那么什么也不做，代码执行完毕或者继续执行后续的代码


weather = input('今天天气怎么样')
if weather == '下雨':     如果  否则如果     否则
    print('带伞') 
elif weather == '台风':
    print('注意安全')
else:
    print('涂防晒')
    
这2个条件都不满足时，输出else的内容，满足下雨就走第一个，满足台风就走第二个，1和2都不满足的，则输出else的内容
对齐的是一组if else 不是谁离得近谁就是一组


if 1:
    print('jiayou')
输出： jiayou

非0，也是被认为可以执行if语句的

if 0:
    print('输出')
执行：无任何输出

字符串拆分如果，没有拆分的标志，那么整体就是作为列表的一个值
words = input('你饿了吗？天气怎么样')
aa = words.split('')
status = aa[0]
weather = aa[-1]
if status == '饿':
    print('eat')
    open = input('楼下开门了吗？')
    if open == '开':
        print('下来吃饭')
    else:
        print('吃个其它的')
else:
    print('study')

if weather == '下雨':     如果  否则如果     否则
    print('带伞') 
elif weather == '台风':
    print('注意安全')
else:
    print('涂防晒')
    
    
    
模糊判断 用in来实现
status = input('你饿了吗？')
aa = ['饿了','有点饿','非常饿']
if status in aa:
    print('吃饭')
    
    
另外一种写法
status = input('你饿了吗？')
if '饿' in status:
    print('吃饭')
    
if '饿' in status and '不' not in status:

if status.find('饿') >= 0 and '不' not in status: 
这个就活学活用了字符串的find方法，找到这个值，返回下标，这个下标一定是大于等于0的，所以如果找不到就是-1


while 循环
判断多次，非0  或者为True就可以往下执行，这里执行的等同于if的要求

n = 0
while 3>2:
    print('欢迎来到第{n}期')
    n+=1
    
死循环就此开始，因为条件一直为True  每执行一次，都会重新回到while去做一次判断

修改
n = 0
while n<= 37:
    print('欢迎来到第{n}期')
    n+=1
运行到37停止，因为当n 取到37时，此时继续往下走就是38  然后进行while判断。38 不小于37，为False 则循环结束

如下例子： 
answer = input("你爱我吗？") 第一次输入的变量值
while answer != '爱':    如果这个值不等于爱，那么进入当前这个while循环
    answer = input('打你，重说') 可以重新获取输入值，并把这个值赋值给answer变量，参与到下一次的循环判断中，周而复始，直到你回答爱，那么循环不进入，直接走后面的print

print('去领证吧！')


n = 0
while 3>2:
    print('欢迎来到第{n}期')     这个条件是永远的true 所以这个循环可以一直执行，我们使用break关键字，使得当n大于37后，如n为38时，进入if循环，看到关键字break，直接结束当前循环
    n+=1
    if n > 37 :
        break
break关键字可以终止循环，但是多层的嵌套，break只能结束当前这个的循环，无法结束整体的

n = 0
status = True
while status:
    print('欢迎来到第{n}期')     这个条件是永远的true 所以这个循环可以一直执行，我们使用break关键字，使得当n大于37后，如n为38时，进入if循环，重新给status赋值，是False，while循环不执行
    n+=1
    if n > 37 :
        status = False

使用 True  或者 False来解决while循环

再有如下的死循环
answer = input('刀锋老师帅不帅？')
while answer == '帅':
    result = input('刀锋老师和曼巴谁帅？')
    while result != '刀锋':
        result  = input('重说：')
        
    优化
    answer = '不帅'     这里可以结束掉这种死循环，这个answer一定是等上面while循环结束了才执行
        
print('over')

我们希望说三次，不对就算了
answer = input('刀锋老师帅不帅？')
while answer == '帅':
    result = input('刀锋老师和曼巴谁帅？')
    n = 1
    while result == '刀锋':
        if n >3 :
            answer = '不帅'
            result = '利剑'
            print('end')
        else:
            result  = input('重说：')
            n +=1  
print('over')


当while多层嵌套，我们想结束整体的循环时，可以从最内层，通过给变量赋值，然后让每一层的while都是False即可，所以while条件我们用 变量来写

while循环这里，我的理解是，循环条件满足时，我们进入while内的语句，执行完里边的以后，开始下一次的循环，如果循环套循环，则执行完内部
的循环后才可以执行后续的语句，如果内部执行完后，再次进行外部的循环
对于while循环，它的触发条件为True,或者非空，注意避免死循环，我们结束这种循环或者结束单个while循环可以使用break关键字
当你执行到break时，结束整个循环，执行后续的代码
对于多层嵌套的循环，在条件处时我们就使用变量来和条件做是否等的关系，这样在后续我们想终止循环时，达成False条件时，可以通过循环内部的重新赋值来完成


for循环，for循环需要我们提供一个循环的池子，把这个池子中循环的东西那拿完了，那么这个循环就结束了
首先你必须要有一个可循环的对象，如字符串 列表  元组 集合 字典
对字符串 每次循环取一个字符
对列表，每次取列表中的一个值
对元组，取一个元素
对集合，取一个元素
对字典，取一个key
我们可以遍历这些可循环的对象，取其所有的值，取完则循环结束
a = 'hello everyone'
for n in a:   这个n代表一个临时的变量 后面的a是我们要被取的可循环对象
    print(n)     输出会把这个字符串每个值都单独打印出来，包括空格
    
再形如
aa = [1,2.5,'hello everyone',True]
for n in aa:
    print(aa)
    
再形如
aa = (1,2.5,'hello everyone',True)
for n in aa:
    print(aa)
    
再形如
aa = {1,2.5,'hello everyone',True}
for n in aa:
    print(aa)   这里会有一个坑    集合的一个特性是去重，所以True被当成1  去重了   只会打印输出3个元素，不单纯的打印a也会这样，只有3个元素，True和1被作为同一个，去重了
    
    
aaa = {'name':'曼巴';'age':16}
print(aaa)
for n in aaa:
    print(aaa)   对于字典的遍历，每次默认取到的是键

还有以下三种因为字典的特殊，而有的写法
for n in aaa.keys():    键
    print(n)
for n in aaa.values():    值
    print(n)
for n in aaa.items():   键值，以元组的形式
    print(n)
    
    
if 是单次判断  while是循环判断，每次循环时判断下当前条件  for需要一个可循环的对象，这个对象里的元素循环完毕后本次循环结束，有限次的循环

a = [1,2,3,4,5,6,7,8]
del a[6:2:-1]
print(a)
输出：这里是每次从6减一的往下切，6-2左闭右开，可以取6 5 4 3位置的数字并删除 得到[1,2,3,8],正是因为步长是负值，所以才可以前面的大后面的小，依次做减法

如果你的for循环是一个列表，那你使用for n in range(len(a)): 是最好的方式

random.randint(1,100) 生成一个随机整数，为1-99


我们使用猜数字的时候，外面是while循环，里边是if条件判断，循环的事放在外面去做，下方的第二种写法，循环放在了内部，增加了一些不必要的循环

import random
num = random.randint(1,100)     这个和切片不同，这是闭区间的 1 和100都有机会可以被取到
print(num)
a = int(input('请输入0-100的整数'))
while a != num:
    if a < num :
        print(int(input('小于该数字，重新输入')))
    if a > num :
        print(int(input('大于该数字，重新输入')))
        
    另外一种写法
    while a<num:
        print(int(input('小于该数字，重新输入')))
    while a>num:
        print(int(input('大于该数字，重新输入')))   
        
        
print('输入正确')









1.判断奇数偶数
a = abs(int(input('请输入整数')))
if a%2 == 0:
    print(f'{a}是偶数')
else:
    print(f'{a}是奇数')
    
2.用户名密码登录           简单来说3个场景    所有的登录里边，账号只有存在和不存在2种  ，用户存在的情况下再去，看密码是否正确，所以我们代码逻辑应该
是，先判断账号是否存在，不存在直接提示未注册，存在的话才继续判断密码正确还是密码错误

a = True
n = 0
while a:
    username = input('用户名')
    passwd = input('密码')
    
    if username == '123':
        if passwd == '123':
            print('登录成功')
            break
        else:
            print('密码错误')
    if username != '123':
        print('用户名不存在')
        
    n+=1
    if n>9:
        a = False
        
        
        
username = {'admin':'123456','zhangsan':'123','manba':'123'}
user_info = input('用户名')
passwd_info = input('密码')
if user_info in list(username.keys()):
    if passwd_info == username[user_info]:
        print('登录成功')
    else:
        print('error')
else:
    print('用户名不存在')
    
    
放入循环直到成功
while True:
    username = {'admin':'123456','zhangsan':'123','manba':'123'}
    user_info = input('用户名')
    passwd_info = input('密码')
    if user_info in list(username.keys()):
        if passwd_info == username[user_info]:
            print('登录成功')
            break
        else:
            print('error')
    else:
        print('用户名不存在')
        
        
优化，用户名正确，密码错误，一直输入密码，保留用户名
a = True
while a:
    username = {'admin':'123456','zhangsan':'123','manba':'123'}
    user_info = input('用户名')
    passwd_info = input('密码')
    while user_info in list(username.keys()):
        if passwd_info == username[user_info]:
            print('登录成功')
            a = False
            break
        else:
            passwd_info = input('error，重新输入')
    else:
        print('用户名不存在')
        
        
        
        
99乘法表
第一种写法
a =1
b =1
while b <= 9 and a < 9:
    for n in range(8):
        if a<b:
            print(f'{a}*{b}={a*b}',end='')
            a+=1
    print(f'{a}*{b}={a*b}')
    a=1
    b+=1
    
第二种写法
for n in range(1,10):
    m = 1
    while m <10:
        if n == m:
            print(f'{n}*{m}={n*m}')
        elif n>m:
            print(f'{m}*{n}={n*m}',end='')
        m+=1
        
第三种写法
for n in range(1,10):
    for m in range(1,10):
            if n == m:
                print(f'{n}*{m}={n*m}')
            elif n>m:
                print(f'{m}*{n}={n*m}',end='')
                
第四种写法
for n in range(1,10):
    # print(f'--------n={n}-------')
    for m in range(1,n+1):
        print(f'{m}*{n}={n*m}',end=' ')
    print()  因为每次都是如果相等乘的时候才换行，而相等的时候也是for循环结束的时候。所以每次for循环结束的时候换行即可，用print(),就是换行
    
简化
for n in range(1,10):
    for m in range(1,n+1):
        print(f'{m}*{n}={n*m}',end=' ')   使用制表符\t 使得间距一致
    print()
        
        
        
依次让用户输入数学 语文 英语 综合成绩 用,隔开    判断四门成绩的格式是否为纯数字，错误需要重新输入，正确则转为整型放入列表
aa = input('数学,语文,英语,综合成绩').split(',')
for n in range(len(aa)):                    见列表一定要拿索引，知道索引一定可以取到值
     while aa[n].isdigit() != True
        aa[n] = input('格式错误')
    aa[n] = int(aa[n])
    
    
    
优化
aa = input('数学,语文,英语,综合成绩').split(',')
subjects = ['数学','语文','英语','综合成绩']
for n in range(len(aa)):                  
     while aa[n].isdigit() != True
        aa[n] = input(f'{subjects[n]}成绩格式错误')
    aa[n] = int(aa[n])
    
    
    
    
    
猜数字，比大小
import random 
num_new = random.randint(1,100)
print(num_new)
while True:
    num =  int(input('输入一个数字'))
    if num == num_news:
        print('over')
        break
    elif num > num_news:
        print('太大了')
    elif num < num_news:     优化这里直接使用else:
        print('太小了')
        
        
        
优化：
import random 
num_new = random.randint(1,100)
print(num_new)
while True:
    num =  (input('输入一个数字'))
    while num.isdigit() == False:
        num =  int(input('格式错误，输入一个数字'))
    num = int(num)
    if num == num_news:
        print('over')
        break
    elif num > num_news:
        print('太大了')
    elif num < num_news:     优化这里直接使用else:
        print('太小了')
        
"""
# answer = input('刀锋老师帅不帅？')
# while answer == '帅':
#     result = input('刀锋老师和曼巴谁帅？')
#     n = 1
#     while result == '刀锋':
#         if n >3 :
#             answer = '不帅'
#             result = '利剑'
#             print('end')
#         else:
#             result  = input('重说：')
#             n +=1
# print('over')

# for n in range(1,10):
#     m = 1
#     while m <10:
#         if n == m:
#             print(f'{n}*{m}={n*m}')
#         elif n>m:
#             print(f'{m}*{n}={n*m}',end=' ')
#         m+=1
